package com.lanou3g.hw0412;

/**
 * If there are no bugs, it was created by Chen FengYao on 2018/4/13;
 * Otherwise, I don't know who created it either
 */

public class OpPower extends Operator {

    /*
    如何求幂:
    1. num2 == 0 => 结果固定是1
    2. num2 != 0 => 结果是 num1 * (num1 的 num2 -1 次幂)
     */
    // 2 * 4 = 8
    // 值1 = 4
    // 2 ^ 3
    // 递归(非常简单的了解一下即可)
    // 在一个方法中 调用自己 就叫做递归
    // 递归的好处: 当我们把条件想清楚了之后
    //              不需要额外的编程思想,直接翻译成代码
    //              所有的递归,都可以用迭代(循环)来实现
    //              并且 普通递归 效率低下
    @Override
    public Number compute(int num1, int num2) {
//        return Math.pow(num1,num2); // 系统自带
        if (num2 < 0){
            return 1f / power(num1,num2 * -1);//Float
        }else {
            return power(num1,num2);// Integer
        }
    }

    // 只算 num2 > 0 的情况
    // 2^ 3
    // => 2 * 4 = 8
    // 值1(2,2) =  2 * 2 = 4
    // 值2(2,1) = 2
    // 值3(2,0) = 1
    private Integer power(int num1, int num2){
        if (num2 == 0){
            // 任何数的 0 次幂都为1
            return 1;
        } else {
            return num1 * power(num1, num2 - 1);
        }
    }
}
